home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 32
/
Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso
/
Aminet
/
docs
/
misc
/
rusdevdocs.lha
/
mui
next >
Wrap
Text File
|
1999-05-16
|
44KB
|
1,090 lines
Ïðîãðàììèðîâàíèå MUI äëÿ íà÷èíàþùèõ, âåðñèÿ 2.1 beta
(C) 1999 RDC
1) ×åì îòëè÷àåòñÿ MUI îò âñåõ ïðî÷èõ èíòåðôåéñíûõ ñèñòåì,
èëè ïî÷åìó íåò ñìûñëà äåëàòü ñîôò íå ïîä MUI ;-)
Åñòü äâà òèïà èíòåðôåéñíûõ ñèñòåì. Ê ïåðâîìó îòíîñèòñÿ
íèçêîóðîâíåâûé Intuition, áîëåå âûñîêîóðîâíåâûé Gadtools,
à òàêæå èíòåðôåéñû MacOS è Windows. Ïðîãðàììèðîâàíèå ýòèõ èíòåðôåéñîâ
ñâîäèòñÿ ê êðàéíå òðóäî¸ìêîé çàäà÷å ïîäáîðà êîîðäèíàò è ðàçìåðîâ
êàæäîãî ýëåìåíòà. Áîëüøèíñòâî ïðîãðàìì, íàïèñàííûõ ïîä ïîäîáíûå
èíòåðôåéñû, èìåþò íàáîð êîíñòàíò, îïðåäåëÿþùèõ êîîðäèíàòû è ðàçìåðû.
Òàêèå ïðîãðàììû ìîãóò ðàáîòàòü òîëüêî ñî øðèôòîì îïðåäåë¸ííîãî ðàçìåðà
è ñ îïðåäåë¸ííûì ÿçûêîì. Ïîïûòêè èçìåíèòü øðèôò èëè ëîêàëèçîâàòü
ïðîãðàììó ïðèâîäÿò ê òîìó, ÷òî íàäïèñè íà÷èíàþò âûëåçàòü çà ïðåäåëû
ýëåìåíòîâ. Íåêîòîðûå ïðîãðàììû óìåþò ìàñøòàáèðîâàòü èíòåðôåéñ öåëèêîì
â çàâèñèìîñòè îò ðàçìåðà øðèôòà - íî îïÿòü æå, íå ó÷èòûâàþò òî, ÷òî
øèðèíà íàäïèñè ïðîïîðöèîíàëüíûì øðèôòîì çàâèñèò íå ñòîëüêî îò ðàçìåðà
øðèôòà, ñêîëüêî îò ñîäåðæàíèÿ íàäïèñè. Îñîáî óìíûå ïðîãðàììû
ó÷èòûâàþò è ýòî - â ðåçóëüòàòå, ñòîèò íàäïèñè íà âñåãî ëèøü îäíîé
êíîïêå â ãîðèçîíòàëüíîì ðÿäó óâåëè÷èòüñÿ ðàçà â äâà, êàê ðàñøèðÿåòñÿ â
äâà ðàçà âñ¸ îêíî (íàáëþäàë ñàìîëè÷íî â ðóñèôèöèðîâàííîì TERM).
Òåïåðü ïîñìîòðèì ñ ïîçèöèè ïðîãðàììèñòà. Îí âûíóæäåí âðó÷íóþ
ïîäáèðàòü ýòè ïðåñëîâóòûå êîîðäèíàòû. Ðàíüøå ýòî äåëàëîñü âîîáùå ÷óòü
ëè íå íà ëèñòå áóìàãè â êëåòêó. Ïîçæå ïîÿâèëèñü ïðîãðàììû òèïà
GadToolsBox, ïîçâîëÿþùèå ðàññòàâëÿòü ýëåìåíòû ìûøêîé - íî è ýòî ðàáîòà
íå äëÿ ñëàáîíåðâíûõ. Ïîëíàÿ ïåðåãðóïïèðîâêà èíòåðôåéñà èç-çà
äîáàâëåíèÿ ïàðû êíîïîê ðàâíîçíà÷íà ïåðåäåëûâàíèþ åãî çàíîâî. Âñ¸
âðåìÿ ïðèõîäèòñÿ ïðèêèäûâàòü, íàñêîëüêî ýñòåòè÷íî ñìîòðèòñÿ èíòåðôåéñ.
Íå ïîëó÷èëîñü ëè, ÷òî èíòåðâàë ìåæäó ýòèìè äâóìÿ êíîïêàìè ÷óòü ìåíüøå,
÷åì ìåæäó òåìè?
Êðîìå òîãî, óïðàâëÿþùèìè ýëåìåíòàìè èíòåðôåéñà ñîáñòâåííî èíòåðôåéñ
íå îãðàíè÷èâàåòñÿ. Êðîìå íèõ, åñòü åù¸ è ýëåìåíòû îôîðìëåíèÿ - âñÿêèå
íàäïèñè, ðàìî÷êè, êàðòèíî÷êè. Èõ óæå íóæíî ðèñîâàòü â îêíå âðó÷íóþ.
Ïðè÷¸ì - êàæäûé ðàç, êîãäà ïðèõîäèò IDCMP-ñîîáùåíèå ñ ïðîñüáîé
ïåðåðèñîâàòü îêíî... Ïðèëè÷íàÿ ïðîãðàììà äîëæíà îáåñïå÷èâàòü þçåðó
âîçìîæíîñòü ïîìåíÿòü ðàçìåð îêíà - à äëÿ ýòîãî ïðèä¸òñÿ ïðè ïîëó÷åíèè
ñîîáùåíèÿ î íîâîì ðàçìåðå ïåðåñ÷èòûâàòü ïîëîæåíèå è ðàçìåð ðÿäà
ýëåìåíòîâ. È íàêîíåö, íóæíî îáÿçàòåëüíî îïðåäåëÿòü ðàçìåðû ðàìêè îêíà,
÷òîáû ïðè ðàçíûõ ðàçìåðàõ ýëåìåíòû íå «íàïîëçàëè» íà íå¸.
Âòîðîé òèï èíòåðôåéñíûõ ñèñòåì - ñèñòåìû ñ àâòîìàòè÷åñêîé
êîìïîíîâêîé (automatic layout). Ê ýòîìó êëàññó îòíîñÿòñÿ MUI,
ClassAct, BGUI, GTLayout, à òàêæå Motif/Lesstif ïîä UNIX.
 ýòîì ñëó÷àå ïîíÿòèÿ «êîîðäèíàòû è ðàçìåðû» íåò âîîáùå.
Ïðîãðàììèñò ãðóïïèðóåò ýëåìåíòû èíòåðôåéñà, ñâÿçûâàÿ èõ ìåæäó ñîáîé è
îïðåäåëÿÿ âçàèìîñâÿçè, à èíòåðôåéñíàÿ áèáëèîòåêà óæå ñàìîñòîÿòåëüíî
(ïðè êàæäîì èçìåíåíèè ïîëüçîâàòåëåì ðàçìåðà îêíà!) âû÷èñëÿåò, êàêèå
êîîðäèíàòû è ðàçìåðû áóäóò ó òîãî èëè èíîãî ýëåìåíòà. Ïðè ýòîì â
çàâèñèìîñòè îò ðàçìåðîâ êàðòèíîê è íàäïèñåé èíòåðôåéñ ìîæåò áûòü
çíà÷èòåëüíî ïåðåãðóïïèðîâàí. Äëÿ òàêîãî ïîäõîäà áîëåå íå òðåáóþòñÿ
êîíñòðóêòîðû èíòåðôåéñîâ è ìó÷èòåëüíûé ïîäáîð êîîðäèíàò.
Ïåðå÷èñëåííûå èíòåðôåéñû òîæå íå ðàâíîçíà÷íû (Motif â äàííîì
êîíòåêñòå ðàññìàòðèâàòüñÿ íå áóäåò, õîòÿ ïî âîçìîæíîñòÿì îí âî ìíîãîì
ïîõîæ íà MUI). MUI îòëè÷àåòñÿ ðÿäîì ñâîéñòâ, ïîçâîëÿþùèõ çíà÷èòåëüíî
óïðîñòèòü ïðîãðàììó, óâåëè÷èâàÿ å¸ âîçìîæíîñòè. Ïðîãðàììèñòó ïîä MUI
íå íóæíî çàäóìûâàòüñÿ î âñÿêîãî ðîäà ïîäëîæêàõ - äîñòàòî÷íî óêàçàòü
ôëàã òèïà «çäåñü áóäåò ïîäëîæêà, ïðåäíàçíà÷åííàÿ äëÿ êíîïêè». À óæå
êàêàÿ ïîäëîæêà äîëæíà áûòü ó êíîïêè, ðåøàåò þçåð â MUI prefs. Äëÿ
ðåàëèçàöèè drag'n'drop äîñòàòî÷íî óêàçàòü, êàêèå îáúåêòû ìîæíî òàñêàòü
è íà êàêèå îáúåêòû èõ ìîæíî êèäàòü - è ñîâñåì íå íóæíî âðó÷íóþ
èçîáðàæàòü ïðîöåññ dnd, êàê ýòî ñäåëàíî â òåõ æå SnoopDOS èëè DOpus5.
Ìîæíî äàæå ïåðåòàñêèâàòü ýëåìåíòû èíòåðôåéñà, äèíàìè÷åñêè ìåíÿÿ èõ
ðàññòàíîâêó â îêíå - è ïðèëîæåíèå íå äîëæíî çàáîòèòüñÿ îá ýòîì -
õîðîøèì ïðèìåðîì ÿâëÿåòñÿ IBrowse. MUI ïîçâîëÿåò äèíàìè÷åñêè óáðàòü
èëè âîññòàíîâèòü òîò èëè èíîé ýëåìåíò èëè ãðóïïó ýëåìåíòîâ - è îêíî
áóäåò òóò æå ïåðåðèñîâàíî, à ïðè íåîáõîäèìîñòè äàæå èçìåíèò ðàçìåð. È
íàêîíåö, ñàìîå èíòåðåñíîå ñâîéñòâî - MUI ïîçâîëÿåò óñòàíàâëèâàòü ñâÿçè
ìåæäó ýëåìåíòàìè. Íàïðèìåð, èíòåðôåéñ âèäà - ãàëî÷êà, óñòàíîâêà
êîòîðîé îçíà÷àåò îòêðûòèå îêíà, à óáèðàíèå å¸ èëè íàæàòèå íà êíîïêó
çàêðûòèÿ âûçûâàåò àâòîìàòè÷åñêîå çàêðûòèå ýòîãî îêíà - äåëàåòñÿ
ñðåäñòâàìè ñàìîãî MUI. Íóæíî âñåãî ëèøü óêàçàòü ñâÿçè, è ñ ýòîãî
ìîìåíòà MUI áóäåò ñàì îáðàáàòûâàòü äàííóþ ñèòóàöèþ, à ïðîãðàììà äàæå
íå áóäåò ïîëó÷àòü óïðàâëåíèÿ ïî ïîâîäó ýòîãî ñîáûòèÿ - ðàçóìååòñÿ,
åñëè îíà ýòîãî íå çàõî÷åò.
Ýëåìåíòû èíòåðôåéñà MUI íå èñ÷åðïûâàþòñÿ íàáîðîì èìåþùèõñÿ. Èõ
ìîæíî äåëàòü ñàìîìó - òàê íàçûâàåìûå custom classes. Íàïðèìåð,
ñóùåñòâóåò ýëåìåíò èíòåðôåéñà HTMLview, ôàêòè÷åñêè ïðåäñòàâëÿþùèé
ñîáîé Web-áðàóçåð. Óêàæåøü åìó âåá-ñòðàíèöó - îí å¸ òóò æå ïîêàæåò
âìåñòå ñî âñåìè êàðòèíêàìè è àíèìàöèÿìè, è ïîçâîëèò ïðîêðó÷èâàòü
òóäà-ñþäà, êîïèðîâàòü òåêñò â clipboard.
2) Îáùàÿ êîíöåïöèÿ MUI.
MUI ïîñòðîåí íà BOOPSI - Basic Object-Oriented Programming System
for Intuition. Èíòåðôåéñ BOOPSI ïîÿâèëñÿ åù¸ â OS 2.0. Âñïîìíèòå
Palette Prefs - êðóã âûáîðà öâåòà è ñëàéäåð ñ ãðàäèåíòîì ïðåäñòàâëÿþò
ñîáîé BOOPSI-îáúåêòû. Åñëè Âû èìååòå ïîíÿòèå î BOOPSI è âîîáùå îá
îáúåêòíî-îðèåíòèðîâàííîì ïîäõîäå - ñëåäóþùèé ïóíêò ìîæåòå íå ÷èòàòü.
3) Îáúåêòíî-îðèåíòèðîâàííûé ïîäõîä.
ÎÎ ïîäõîä ê ïðîãðàììèðîâàíèþ áûë ðàçðàáîòàí ïàðó äåñÿòêîâ ëåò
íàçàä, ïðîÿâèâøèñü â òàêèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ, êàê Simula,
SmallTalk è C++. Ðàññìîòðèì îñíîâíûå ïîíÿòèÿ ÎÎÏ â êîíòåêñòå BOOPSI:
1) Êëàññ. Ôàêòè÷åñêè ýòî áèáëèîòåêà, ïðåäñòàâëÿþùàÿ ñîáîé
îïðåäåë¸ííûé ìàøèííûé êîä.  íàøåì ñëó÷àå îíà ðåàëèçóåò òîò èëè
èíîé ýëåìåíò èíòåðôåéñà.
2) Îáúåêò. Ñîáñòâåííî ýëåìåíò èíòåðôåéñà. Ïðåäñòàâëÿåò ñîáîé
íå÷òî, èäåíòèôèöèðóåìîå óíèêàëüíûì 32-áèòíûì ÷èñëîì (ôàêòè÷åñêè,
ïðåäñòàâëÿþùèì ñîáîé óêàçàòåëü íà ñòðóêòóðó äàííûõ).
3) Ìåòîä. Ôóíêöèÿ áèáëèîòåêè, ïîçâîëÿþùàÿ ñäåëàòü òî èëè èíîå
äåéñòâèå ñ îáúåêòîì - ê ïðèìåðó, âûòàùèòü îêíî íà ïåðåäíèé ïëàí.
4) Àòðèáóò. Ñâîéñòâî îáúåêòà - íàïðèìåð, íàäïèñü íà êíîïêå.
Ýòî ñâîéñòâî ìîæíî êàê ñ÷èòûâàòü, òàê è ìåíÿòü. Äåëàåòñÿ ýòî ñ
ïîìîùüþ ìåòîäîâ «ñ÷èòàòü» è «óñòàíîâèòü».
Êàæäûé îáúåêò ÿâëÿåòñÿ îáúåêòîì îïðåäåë¸ííîãî êëàññà. Êëàññ
ïðåäîñòàâëÿåò íàáîð àòðèáóòîâ è ìåòîäîâ, èìåþùèõ îòíîøåíèå ê äàííîìó
îáúåêòó. Ê ïðèìåðó, ó ëþáîãî îêíà åñòü àòðèáóò «çàãîëîâîê îêíà» è
ìåòîä «óáðàòü îêíî íà çàäíèé ïëàí».
Îáúåêòû ìîæíî äèíàìè÷åñêè ñîçäàâàòü è óíè÷òîæàòü. Ïîêà îáúåêò
ñóùåñòâóåò, íàä íèì ìîæíî âûïîëíÿòü ìåòîäû, ïðèñóùèå êëàññó ýòîãî
îáúåêòà, è ñ÷èòûâàòü/ìåíÿòü àòðèáóòû, ïðèñóùèå êëàññó. Ðÿä àòðèáóòîâ
ìîæíî èíèöèàëèçèðîâàòü íóæíûìè çíà÷åíèÿìè ñðàçó ïðè ñîçäàíèè îáúåêòà.
Ñîçäàíèå è óíè÷òîæåíèå îáúåêòà òîæå ÿâëÿþòñÿ âûïîëíåíèåì ìåòîäîâ.
Êëàññû îðãàíèçîâàíû â äåðåâî, ïîõîæåå íà äåðåâî äèðåêòîðèé
èåðàðõè÷åñêîé ôàéëîâîé ñèñòåìû. Òåì ñàìûì ðåàëèçóåòñÿ åù¸ îäèí ìîìåíò
ÎÎ-ïîäõîäà - íàñëåäîâàíèå. Ñóáêëàññû («ñóáäèðåêòîðèè») íàñëåäóþò âñå
ìåòîäû è àòðèáóòû «ðîäèòåëüñêèõ» êëàññîâ (íàçûâàåìûõ ñóïåðêëàññàìè),
÷òî ïîçâîëÿåò íå ðåàëèçîâûâàòü â ñóáêëàññå çàíîâî óæå ñóùåñòâóþùèå
âåùè. Ôàêòè÷åñêè, ñóáêëàññû ÿâëÿþòñÿ êàê áû ÷àñòíûìè ñëó÷àÿìè
ñóïåðêëàññîâ. Ê ïðèìåðó, ñóáêëàññ «êàðòèíêà» íàñëåäóåò ó êëàññà
«ïðÿìîóãîëüíàÿ îáëàñòü» àòðèáóò «ðàçìåð ïî ãîðèçîíòàëè». Êëàññ
«êàðòèíêà» íå áóäåò îòðàáàòûâàòü ñ÷èòûâàíèå ýòîãî àòðèáóòà - îí ïðîñòî
ïåðåäàñò íåèçâåñòíóþ åìó îïåðàöèþ êëàññó «ïðÿìîóãîëüíàÿ îáëàñòü».
Êàê âñ¸ ýòî «ñîîòíîñèòñÿ ñ ðåàëüíîñòüþ»?  ïåðâóþ î÷åðåäü, ÎÎ
ïîäõîä ïîçâîëÿåò çíà÷èòåëüíî óïðîñòèòü è óïîðÿäî÷èòü ïðîãðàììíûé
èíòåðôåéñ. Ïîñìîòðèòå íà èíòåðôåéñ Exec, Intuition è Graphics - ñîòíè
âûçîâîâ äëÿ ñàìûõ ðàçíûõ öåëåé. Äëÿ ðàáîòû ñ MUI äîñòàòî÷íî íå áîëåå
äåñÿòêà. Óïîðÿäî÷åíèå ñâîäèòñÿ, ê ïðèìåðó, ê òîìó, ÷òî äëÿ
óíè÷òîæåíèÿ îáúåêòà åñòü îäèí åäèíñòâåííûé âûçîâ. À âîâñå íå äåñÿòîê
- çàêðûòü îêíî, çàêðûòü ýêðàí, çàêðûòü ôàéë, çàêðûòü äåâàéñ, çàêðûòü
áèáëèîòåêó, îñâîáîäèòü ñåìàôîð, îñâîáîäèòü áàçó áèáëèîòåêè...
Ñóùåñòâóþò äâà ïîäõîäà ê ÎÎÏ, óñëîâíî íàçîâ¸ì èõ «ñòàòè÷åñêèì» è
«äèíàìè÷åñêèì». Ïåðâûé, ïðèñóùèé C++, ïðåäñòàâëÿåò ñîáîé ÎÎÏ íà ýòàïå
êîìïèëÿöèè. ÎÎ-ïðîãðàììà, ñîäåðæàùàÿ ðàáîòó ñ îáúåêòàìè,
êîìïèëèðóåòñÿ â îáúåêòíûé êîä, óæå íå ñîäåðæàùèé íèêàêèõ îáúåêòîâ.
Äëÿ âñåãî âíåøíåãî ìèðà ýòî òàêàÿ æå ïðîãðàììà, êàê è íàïèñàííàÿ íà
áåéñèêå èëè àññåìáëåðå - ðàçâå ÷òî áîëåå ìîíñòðîâàÿ è òîðìîçíóòàÿ.
Êëàññû C++ íåëüçÿ ïðåäñòàâèòü â âèäå ðàçäåëÿåìûõ áèáëèîòåê. Îíè
îáÿçàòåëüíî ëèíêóþòñÿ ê ïðîãðàììå, óâåëè÷èâàÿ å¸ îáú¸ì íà ñîòíè
êèëîáàéò è ìåãàáàéòû. Ñîáñòâåííî, ïîñëåäñòâèÿ ýòîãî ïîäõîäà ìîæíî
íàáëþäàòü ñåé÷àñ íà PC.
Äèíàìè÷åñêèé ïîäõîä, ïðèñóùèé SmallTalk è BOOPSI, ñâîäèòñÿ ê òîìó,
÷òî îáúåêòû äåéñòâèòåëüíî ñóùåñòâóþò è ïðåäîñòàâëÿþòñÿ îêðóæåíèåì.
Ïðîãðàììà îïåðèðóåò ôóíêöèÿìè îêðóæåíèÿ äëÿ äîñòóïà ê íèì. Â ýòîì
ñëó÷àå ïðîãðàììà óæå íå ñîäåðæèò ëèøíåãî êîäà è ïîëó÷àåòñÿ
èñêëþ÷èòåëüíî êîìïàêòíîé (âñïîìíèòå MUI Prefs - âñåãî 7 êèëîáàéò!).
4) Äîêóìåíòàöèÿ ïî MUI
Îïèñàíèÿ MUI ïîõîæè íà îáû÷íûå autodocs, íî îíè îïèñûâàþò íå
ôóíêöèè áèáëèîòåêè, à íàáîð àòðèáóòîâ è ìåòîäîâ, ïðèñóùèé êëàññó.
Êàæäûé êëàññ èìååò ñâî¸ îïèñàíèå.
Àòðèáóòû - ýòî êîíñòàíòû, íà÷èíàþùèåñÿ ñ «MUIA_».
Ìåòîäû - êîíñòàíòû, íà÷èíàþùèåñÿ ñ «MUIM_».
Ïðè îïèñàíèè àòðèáóòîâ ìîæíî âñòðåòèòü ÷òî-òî òèïà [ISG].
Ýòî ñî÷åòàíèå ñèìâîëîâ îïðåäåëÿåò, ìîæåò ëè äàííûé àòðèáóò ïðèìåíÿòüñÿ
ïðè èíèöèàëèçàöèè îáúåêòà (Init), ìîæåò ëè èçìåíÿòüñÿ ïðîãðàììîé â
ïðîöåññå ðàáîòû (Set), è ìîæåò ëè çíà÷åíèå àòðèáóòà áûòü ñ÷èòàííûì
(Get). Åñëè êàêîé-ëèáî âîçìîæíîñòè ó àòðèáóòà íåò, îíà çàìåíÿåòñÿ
òî÷êîé. Íàïðèìåð, àòðèáóò, êîòîðûé ìîæåò áûòü óñòàíîâëåí òîëüêî ïðè
ñîçäàíèè îáúåêòà, îáîçíà÷àåòñÿ êàê [I..].
5) Ôóíêöèè, êîòîðûå íàì ïîòðåáóþòñÿ äëÿ íà÷àëà.
- Ôóíêöèè muimaster.library:
MUI_NewObject() - ñîçäàíèå îáúåêòà. Èìååò äâà àðãóìåíòà - èìÿ
êëàññà (ñòðîêà) è taglist. Ïîñëåäíèé
ïðåäñòàâëÿåò ñîáîé íàáîð ïàð ëîíãîâ, ïåðâûé
èç êîòîðûõ - àòðèáóò, à âòîðîé - åãî
çíà÷åíèå. Ýòî ïîçâîëÿåò èíèöèàëèçèðîâàòü ðÿä
àòðèáóòîâ íóæíûìè çíà÷åíèÿìè ñðàçó ïðè
ñîçäàíèè îáúåêòà. Ôóíêöèÿ âîçâðàùàåò
óêàçàòåëü íà îáúåêò.
Âàæíîå çàìå÷àíèå: ïðè ñîçäàíèè ìíîæåñòâà
îáúåêòîâ íàáîðîì ôóíêöèé MUI_NewObject()
â èñïîëíÿåìîì ôàéëå ïîÿâèòñÿ ìíîæåñòâî
îäèíàêîâûõ ñòðîê. Â êîìïèëÿòîðå SAS/C 6.x
åñòü îïöèÿ StringMerge (Compiler options â
scopts), ïðåîáðàçóþùàÿ óêàçàòåëè íà âñå
îäèíàêîâûå ñòðîêè â óêàçàòåëü íà îäíó.
MUI_DisposeObject() - óíè÷òîæåíèå îáúåêòà.
- ôóíêöèÿ amiga.lib (ëèíêóåìîé áèáëèîòåêè):
DoMethod() - âûïîëíåíèå ìåòîäà íàä îáúåêòîì. Àðãóìåíòû -
óêàçàòåëü íà îáúåêò, êîä (íîìåð) ìåòîäà è
ñïèñîê àðãóìåíòîâ ìåòîäà.
- ìàêðîñû:
MAKE_ID() - ìàêðîñ äëÿ ïðåîáðàçîâàíèÿ ÷åòûð¸õ ñèìâîëîâ â
îäèí ëîíã, ñîñòîÿùèé èç ýòèõ ÷åòûð¸õ áàéò.
 êîìïèëÿòîðå HisoftC 4.x âìåñòî ýòîãî ìîæíî
èñïîëüçîâàòü ñèìâîëüíóþ êîíñòàíòó - ýòè æå
÷åòûðå ñèìâîëà â àïîñòðîôàõ.
set() - ìàêðîñ äëÿ óñòàíîâêè àòðèáóòà. Àðãóìåíòû -
îáúåêò, àòðèáóò è åãî çíà÷åíèå.
get() - ìàêðîñ äëÿ ñ÷èòûâàíèÿ àòðèáóòà. Àðãóìåíòû -
îáúåêò, àòðèáóò è óêàçàòåëü íà ïåðåìåííóþ,
êóäà ïîëîæèòü ðåçóëüòàò.
Ìàêðîñû ðàçâ¸ðòûâàþòñÿ â SetAttrs() è GetAttr() ñîîòâåòñòâåííî.
6) Ñîçäàíèå ïðîñòåéøåãî èíòåðôåéñà.
Èíòåðôåéñ ïðåäñòàâëÿåò ñîáîé äåðåâî îáúåêòîâ. Íå ïóòàéòå åãî ñ
óïîìÿíóòûì ðàíåå äåðåâîì êëàññîâ. Êàæäûé îáúåêò ñîçäà¸òñÿ âûçîâîì
ôóíêöèè MUI_NewObject(). ×òîáû ó îáúåêòà áûëè äî÷åðíèå îáúåêòû, â
ñïèñêå òýãîâ óêàçûâàåòñÿ òýã Child, àðãóìåíòîì êîòîðîãî ÿâëÿåòñÿ
óêàçàòåëü íà óæå ñîçäàííûé äî÷åðíèé îáúåêò. Òàêèì îáðàçîì, ñîçäàíèå
èíòåðôåéñà âåä¸òñÿ îò ñàìûõ «ìåëêèõ» îáúåêòîâ ê ñàìûì êðóïíûì.
Êðóïíûå îáúåêòû ñîäåðæàò â ñåáå (òåððèòîðèàëüíî) áîëåå ìåëêèå è òàê
äàëåå. Îêíî ñîäåðæèò â ñåáå ãðóïïû îáúåêòîâ, òå ñîäåðæàò â ñåáå
êíîïêè, åù¸ ãðóïïû è ò.ä.  îáùåì ñëó÷àå äåðåâî îáúåêòîâ òèïè÷íîãî
ïðèëîæåíèÿ âûãëÿäèò òàê:
¡¡¡¡¡¡¡¡¡¡¡¡¯
¢ Ïðèëîæåíèå ¢
¿¡¡¡¡¡¾¡¡¡¡¡¡´
¢
----¡¡¡¡¡¡¾¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡µ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¯
¢ ¢ ¢
¡¡¡¶¡¡¯ ¡¡¡¶¡¡¯ ¡¡¡¶¡¡¯
¢ Îêíî ¢ ¢ Îêíî ¢ ¢ Îêíî ¢
¿¡¡¡¾¡¡´ ¿¡¡¡¾¡¡´ ¿¡¡¡¾¡¡´
¢ ¢ ¢
¡¡¡¡¶¡¡¡¯ : :
¢ Ãðóïïà ¢
¿¡¡¡¡¾¡¡¡´ ê âîïðîñó î ïîëüçå ïñåâäîãðàôèêè ;)
¢
¡¡¡¡¡¡¡¡¡¡¡¡¾¡¶¡¡¡¡¡¡¡¡¾¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¯
¢ ¢ ¢ ¢
¡¡¡¡¡¡¶¡¡¡¡¡¯ ¡¡¡¶¡¡¡¡¯ ¡¡¡¶¡¡¡¯ ¡¡¡¶¡¡¡¡¯
¢ Ïîëå ââîäà ¢ ¢ Ãðóïïà ¢ ¢ Òåêñò ¢ ¢ Ãðóïïà ¢
¿¡¡¡¡¡¡¡¡¡¡¡¡´ ¿¡¡¡¾¡¡¡¡´ ¿¡¡¡¡¡¡¡´ ¿¡¡¡¾¡¡¡¡´
¢ ¢
----¡¡¡¡¡¾¡¡¡¡¡¶¡¡¡¡¡¯ ¡¡¡¡¡¡¡¡¡¡¡µ¡¡¡¡¡¡¡-----
¢ ¢ ¢ ¢
¡¡¡¡¶¡¡¡¯ ¡¡¡¶¡¡¯ ¡¡¡¡¶¡¡¡¯ ¡¡¡¶¡¡¡¡¯
¢ Ñïèñîê ¢ ¢ Öèêë ¢ ¢ Ñïèñîê ¢ ¢ Ãðóïïà ¢
¿¡¡¡¡¡¡¡¡´ ¿¡¡¡¡¡¡´ ¿¡¡¡¡¡¡¡¡´ ¿¡¡¡¾¡¡¡¡´
¢
¡¡¡¡¡¶¡¡¡¡¡¯
¢ ¢
¡¡¡¶¡¡¡¡¯ ¡¡¡¶¡¡¡¡¯
¢ Êíîïêà ¢ ¢ Êíîïêà ¢
¿¡¡¡¡¡¡¡¡´ ¿¡¡¡¡¡¡¡¡´
Äëÿ óïðîùåíèÿ ýòîãî ïðîöåññà ïðèìåíÿåòñÿ ñëåäóþùèé ïîäõîä (äàëåå
ïðèìåðû áóäóò ïðèâîäèòñÿ íà Ñè - íî ýòî íå çíà÷èò, ÷òî MUI ìîæåò
ïðîãðàììèòüñÿ òîëüêî íà Ñè è íå íà ÷¸ì áîëüøå). Ïèøåòñÿ ôóíêöèÿ,
ñîçäàþùàÿ ñàìûé êðóïíûé îáúåêò - â ñëó÷àå MUI ýòî îáúåêò Application.
 àðãóìåíòàõ óêàçûâàåòñÿ íàáîð å¸ àòðèáóòîâ, à òàêæå òýã SubWindow.
Ïîñëå íåãî î÷åðåäíûì àðãóìåíòîâ MUI_NewObject() óêàçûâàåòñÿ åù¸ îäèí
MUI_NewObject(), ñîçäàþùèé îêíî. Â åãî àðãóìåíòàõ ñòàâèòñÿ Child è
åù¸ âëîæåííûå MUI_NewObject(), ñîçäàþùèå âñ¸ îñòàëüíîå. Óðîâåíü
âëîæåíèÿ â ïðèíöèïå íå îãðàíè÷åí.  èòîãå Ñè ñêîìïèëèðóåò âñ¸ ýòî â
ïîñëåäîâàòåëüíûé âûçîâ ôóíêöèé îò «ñàìûõ âëîæåííûõ» äî êîðíåâîé
ôóíêöèè, ïîäñòàâëÿÿ ðåçóëüòàòû êàê àðãóìåíòû ôóíêöèÿì-«ðîäèòåëÿì».
Î÷åâèäíî, ÷òî ïðè ñîçäàíèè î÷åðåäíîãî îáúåêòà ìîæåò ñëó÷èòüñÿ
îøèáêà - íåäîñòóïåí êëàññ ñ òàêèì èìåíåì, íåõâàòêà ïàìÿòè, äà ìàëî ëè
÷òî åù¸.  òàêîì ñëó÷àå MUI_NewObject() âåðí¸ò íóëü. Äëÿ ýòîãî â MUI
ïðåäóñìîòðåí ìåõàíèçì ñëåäóþùåãî âèäà - åñëè MUI_NewObject() ïîëó÷èë â
êà÷åñòâå õîòÿ áû îäíîãî èç Child íóëü, îí âûïîëíÿåò
MUI_DisposeObject() íàä íåíóëåâûìè Child è âîçâðàùàåò íóëü ñàì. Â
èòîãå, îøèáêà âñåãäà îòñëåæèâàåòñÿ.
Ðàçóìååòñÿ, ïðè ïåðâîì âçãëÿäå íà ýòîò ìåõàíèçì ìîæåò âîçíèêíóòü
âïå÷àòëåíèå, ÷òî èñõîäíûé òåêñò â ðåçóëüòàòå áóäåò ñîäåðæàòü ìíîæåñòâî
ìàëîâðàçóìèòåëüíûõ ôóíêöèé ñ êó÷åé íåïîíÿòíûõ ÷èñåë â êà÷åñòâå
àðãóìåíòîâ. Äëÿ òîãî, ÷òîáû ýòî íå ñëó÷èëîñü, MUI êîìïëåêòóåòñÿ
íàáîðîì ìàêðîñîâ è êîíñòàíò, ðåàëèçóþùèé äîñòàòî÷íî óäîáíûé «ÿçûê
îïèñàíèÿ èíòåðôåéñà».
Object *app, *window1, *button1;
app = ApplicationObject,
MUIA_Application_Title , "Ïðîãðàììà",
MUIA_Application_Version , "$VER: Ïðîãðàììà 1.0 (äàòà)",
MUIA_Application_Copyright , "(C) 1999 Ïðîãðàììèíã Êîìïýíè",
MUIA_Application_Author , "Ïðîãðàììèñò",
MUIA_Application_Description, "Êðàòêîå îïèñàíèå ïðîãðàììû",
MUIA_Application_Base , "ÐÅÊÑ.ÏÎÐÒ.ÏÐÎÃÐÀÌÌÛ",
SubWindow, window1 = WindowObject,
MUIA_Window_Title, "Ïðîãðàììà",
MUIA_Window_ID , MAKE_ID('M','A','I','N'),
WindowContents, button1 = SimpleButton("Íàæìè ìåíÿ");
End,
End;
Êàê âèäíî â ïðèâåä¸ííîì ïðèìåðå, âûçîâû ôóíêöèè MUI_NewObject() ñ
ðàçëè÷íûìè âàðèàíòàìè èì¸í êëàññîâ ñâ¸ðíóòû â ìàêðîñû âèäà xxxObject,
à çàâåðøàþùèå âûçîâ ôóíêöèè TAG_END è ñêîáêà îôîðìëåíû êàê ìàêðîñ End.
Ìåæäó íà÷àëîì è çàâåðøåíèåì ôóíêöèè ðàçìåùàþòñÿ òýãè, ïðåäñòàâëÿþùèå
ñîáîé èíèöèàëèçàöèþ àòðèáóòîâ è óêàçàíèå äî÷åðíèõ îáúåêòîâ.  èòîãå
îïèñàíèå èíòåðôåéñà âåä¸òñÿ «ëåñåíêîé» - îáû÷íûé äëÿ Ñè ñòèëü
ïðîãðàììèðîâàíèÿ.
×àñòü èç ìàêðîñîâ ñîäåðæàò âñþ ôóíêöèþ ñðàçó - íàïðèìåð,
ïðèâåä¸ííûé âûøå SimpleButton().  ýòîì ñëó÷àå End íå òðåáóåòñÿ.
Èñïîëüçîâàòü ýòîò èíòåðôåéñ ìîæíî òîëüêî â òîì ñëó÷àå, åñëè â
ðåçóëüòàòå åãî ñîçäàíèÿ ïåðåìåííàÿ app ñîäåðæèò íå íóëü. À ïî
îêîí÷àíèè ðàáîòû ñ íèì âûïîëíÿåì MUI_DisposeObject(app) - â ýòîì
ñëó÷àå âñå äî÷åðíèå îáúåêòû áóäóò óäàëåíû àâòîìàòè÷åñêè.
Óäàëÿòü ìîæíî ÒÎËÜÊÎ îáúåêòû, êîòîðûå íå ÿâëÿþòñÿ äî÷åðíèìè ïî
îòíîøåíèþ ê êàêèì áû òî íè áûëî åù¸ îáúåêòàì.
 ïðîãðàììå ìîæåò áûòü è íåñêîëüêî îáúåêòîâ êëàññà Application.
Íàïðèìåð, ýòî ïîçâîëèò îòêðûâàòü ðàçíûå Application íà ðàçíûõ ýêðàíàõ.
7) Êîìïîíîâêà îáúåêòîâ
Åñëè òðåáóåòñÿ ÷òî-òî áîëåå ñëîæíîå, ÷åì ðàññìîòðåííàÿ ðàíåå êíîïêà
â îêíå, íàì ïîòðåáóåòñÿ èñïîëüçîâàòü ãðóïïû.
Ãðóïïà - ýòî ïðÿìîóãîëüíûé îáúåêò, êîòîðûé ñîäåðæèò äðóãèå îáúåêòû.
Ãðóïïû ìîãóò áûòü òð¸õ âèäîâ - ãîðèçîíòàëüíûå, âåðòèêàëüíûå, è
ñîäåðæàùèå îïðåäåë¸ííîå êîëè÷åñòâî êîëîíîê. Îáúåêòû ðàçìåùàþòñÿ â
ãðóïïå òàê æå, êàê ÿ÷åéêè â òàáëèöå.  ÿ÷åéêå ãðóïïû ìîæåò áûòü
ðàçìåùåíà åù¸ îäíà ãðóïïà - êîëè÷åñòâî óðîâíåé âëîæåíèÿ îïÿòü æå íå
îãðàíè÷åíî.
Ðàññìîòðèì â êà÷åñòâå ïðèìåðà ñîçäàíèå ôàéëîâîãî ðåêâåñòîðà:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¯
¢ ¢
¢ ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¯ ¡¡¡¡¡¡¯ ¢
¢ ¢ C (dir) ¢ ¢ dh0: ¢ ¢
¢ ¢ Classes (dir) ¢ ¢ dh1: ¢ ¢ è åù¸ ðàç
¢ ¢ Devs (dir) ¢ ¢ dh2: ¢ ¢ ê âîïðîñó
¢ ¢ Expansion (dir) ¢ ¢ df0: ¢ ¢ î ïîëüçå
¢ ¢ ... ¢ ¢ df1: ¢ ¢ ïñåâäîãðàôèêè
¢ ¢ Trashcan.info 1.172 ¢ ¢ df2: ¢ ¢
¢ ¢ Utilities.info 632 ¢ ¢ ram: ¢ ¢ ;-)
¢ ¢ WBStartup.info 632 ¢ ¢ rad: ¢ ¢
¢ ¿¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡´ ¿¡¡¡¡¡¡´ ¢
¢ ¢
¢ Ïóòü: _____________________________ ¢
¢ ¢
¢ Ôàéë: _____________________________ ¢
¢ ¢
¢ ¡¡¡¡¡¡¡¡¯ ¡¡¡¡¡¡¡¡¯ ¢
¢ ¢ Ãîòîâî ¢ ¢ Îòìåíà ¢ ¢
¢ ¿¡¡¡¡¡¡¡¡´ ¿¡¡¡¡¡¡¡¡´ ¢
¢ ¢
¿¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡´
 ýòîì ñëó÷àå ìû èìååì ñëåäóþùèå îáúåêòû: ñïèñêè ñâåðõó ñïðàâà è
ñëåâà, äâà ïîëÿ ââîäà ñòðîêè, è äâå êíîïêè ñíèçó. Íóæíî êàê-òî
ñâÿçàòü ìåæäó ñîáîé âñå ïåðå÷èñëåííûå îáúåêòû, ÷òîáû îíè ðàçìåñòèëèñü
â îêíå â óêàçàííîì âèäå. Äëÿ ýòîãî äâà ñïèñêà ñâåðõó è äâå êíîïêè
ñíèçó îáúåäèíÿþòñÿ â ÃÎÐÈÇÎÍÒÀËÜÍÛÅ ÃÐÓÏÏÛ. Âñ¸ îïèñàííîå
ãðóïïèðóåòñÿ â ÂÅÐÒÈÊÀËÜÍÓÞ ÃÐÓÏÏÓ.
VGroup,
Child, HGroup,
Child, FileListview(), // Êàòàëîã
Child, DeviceListview(), // Óñòðîéñòâà
End,
Child, PathGadget(), // Ïóòü
Child, FileGadget(), // Ôàéë
Child, HGroup,
Child, OkayButton(), // Ãîòîâ
Child, CancelButton(), // Îòìåíà
End,
End;
Ãðóïïû ñ óêàçàííûì êîëè÷åñòâîì êîëîíîê (âåðòèêàëüíûå ãðóïïû - èõ
÷àñòíûé ñëó÷àé) çàïèñûâàþòñÿ êàê ColGroup(êîëè÷åñòâî_êîëîíîê) è èìåþò
ñëåäóþùåå ñâîéñòâî: êîëè÷åñòâî îáúåêòîâ äîëæíî áûòü îáÿçàòåëüíî ðàâíî
ïðîèçâåäåíèþ êîëè÷åñòâà ñòîëáöîâ è êîëè÷åñòâà ñòðîê.
Ðàññìîòðåííûé ìåõàíèçì â íåêîòîðîé ìåðå ÿâëÿåòñÿ àíàëîãîì òàáëèö
â HTML. Êòî çíàêîì ñ HTML, ìîæåò îçíàêîìèòüñÿ ñ Custom-êëàññîì
MCC_TableGroup, â êîòîðîì ñëîæíûå ãðóïïû ôîðìèðóþòñÿ áîëåå óäîáíûì
ñïîñîáîì, ïðàêòè÷åñêè èäåíòè÷íûì ìåõàíèçìó HTML-òàáëèö.
8) Êîìïîíîâêà îáúåêòîâ áîëåå ïîäðîáíî
Îáúåêòû, ðàçìåùàåìûå â ãðóïïå, ìîãóò èìåòü ÂÅÑ (MUIA_Weight). Âåñ
- ýòî ÷èñëî, õàðàêòåðèçóþùåå, êàêóþ ÷àñòü îáùåãî ïðîñòðàíñòâà ñëåäóåò
âûäåëèòü îáúåêòó. Åñëè âåñ îáúåêòà íå óêàçàí, ïî óìîë÷àíèþ îí
ïðèíèìàåòñÿ ðàâíûì 100. Âåñ ìîæåò áûòü óêàçàí ðàçäåëüíî ïî
ãîðèçîíòàëè (MUIA_HorizWeight) è ïî âåðòèêàëè (MUIA_VertWeight).
Òàêèì îáðàçîì, åñëè ìû õîòèì èìåòü êíîïêó «Îòìåíà» âäâîå áîëåå
øèðîêóþ, ÷åì êíîïêà «Ãîòîâî», íóæíî óêàçàòü åé âåñ 200.
Ñóùåñòâóåò òàêæå ñïîñîá ðàññòàâëÿòü îáúåêòû «âðó÷íóþ» - íàïðèìåð,
äëÿ íàïèñàíèÿ Web-áðàóçåðîâ, ãäå ðàñïîëîæåíèå êíîïîê îïðåäåëÿåòñÿ
ñîäåðæàíèåì Web-ñòðàíèöû. Äëÿ ýòîãî ïðèìåíÿåòñÿ àòðèáóò
MUIA_LayoutHook êëàññà Group. Ïðè ýòîì MUI áóäåò âûçûâàòü óêàçàííóþ
ôóíêöèþ êàæäûé ðàç ïåðåä ðàçìåùåíèåì î÷åðåäíîãî îáúåêòà.
Èíòåðâàëû ìåæäó îáúåêòàìè (spacing) îïðåäåëÿþòñÿ â íàñòðîéêàõ
èíòåðôåéñà. Åñëè äëÿ êîíêðåòíîé çàäà÷è íóæíî óñòàíîâèòü îïðåäåë¸ííûé
èíòåðâàë (íàïðèìåð, äëÿ ðàçìåùåíèÿ ðÿäà êíîïîê âïëîòíóþ äðóã ê äðóãó),
ãðóïïå ñ ýòèìè îáúåêòàìè óêàçûâàåòñÿ àòðèáóò MUIA_Group_Spacing ñ
òðåáóåìûì çíà÷åíèåì (â íàøåì ïðèìåðå - íóëü).
Åñòü âîçìîæíîñòü àâòîìàòè÷åñêîãî «èñ÷åçàíèÿ» îáúåêòà, åñëè îí íå
óìåùàåòñÿ â èíòåðôåéñ (ïðèìåð - íàäïèñü ñïðàâà âíèçó â MCP Prefs).
Äëÿ ýòîãî óêàçûâàþòñÿ àòðèáóòû MUIA_HorizDisappear (èñ÷åçàíèå, åñëè
îáúåêò íå óìåùàåòñÿ ïî ãîðèçîíòàëè) è MUIA_VertDisappear (ïî
âåðòèêàëè). Çíà÷åíèå àòðèáóòà - «ñòåïåíü âàæíîñòè» îáúåêòà,
îáúåêòû ñ íàèáîëüøèì çíà÷åíèåì èñ÷åçàþò â ïîñëåäíþþ î÷åðåäü.
9) Ñâÿçûâàíèå îáúåêòîâ è îáðàáîòêà ñîáûòèé
Êîðíåâûì êëàññîì äåðåâà êëàññîâ MUI ÿâëÿåòñÿ êëàññ Notify. Èìåííî
îí ïðåäîñòàâëÿåò ýòó âîçìîæíîñòü.
Ïîñëå ñîçäàíèÿ äåðåâà èíòåðôåéñà íàä ðÿäîì îáúåêòîâ ñëåäóåò
âûïîëíèòü ìåòîä Notify. Äëÿ ýòîãî äåëàåòñÿ âûçîâ ñëåäóþùåãî âèäà:
DoMethod(îáúåêò1,MUIM_Notify,àòðèáóò,çíà÷åíèå,
îáúåêò2,êîëè÷åñòâî_àðãóìåíòîâ,ìåòîä,...)
îáúåêò1 - òîò îáúåêò, èçìåíåíèå ñîñòîÿíèÿ êîòîðîãî ìû ñîáèðàåìñÿ
îñëåæèâàòü. Ïîñëå MUIM_Notify óêàçûâàåòñÿ îòñëåæèâàåìûé àòðèáóò, è òî
çíà÷åíèå, ïðè óñòàíîâêå àòðèáóòà â êîòîðîå ñðàáàòûâàåò óñòàíàâëèâàåìàÿ
íàìè ñâÿçü.
îáúåêò2 - îáúåêò, íàä êîòîðûì ìû áóäåì ïðîèçâîäèòü äåéñòâèå â
ñëó÷àå ñðàáàòûâàíèÿ ñâÿçè. Êîëè÷åñòâî àðãóìåíòîâ - êîíñòàíòà,
óêàçûâàþùàÿ, ñêîëüêî åù¸ àðãóìåíòîâ èä¸ò ïîñëå ýòîé êîíñòàíòû. Ïðè
ñðàáàòûâàíèè ñâÿçè ìîæåò áûòü âûïîëíåí ëþáîé ìåòîä, â òîì ÷èñëå ìåòîä
MUIM_Set, óñòàíàâëèâàþùèé àòðèáóò.
Ê ïðèìåðó, ìû õîòèì, ÷òîáû ïðè âñÿêîì íàæàòèè êíîïêè worst,
radio-button clock áûë óñòàíîâëåí íà ïåðâóþ ïîçèöèþ. Äëÿ ýòîãî ïîñëå
ñîçäàíèÿ èíòåðôåéñà âûïîëíÿåì:
DoMethod(worst,MUIM_Notify,MUIA_Pressed,FALSE,
clock,3,MUIM_Set,MUIA_Radio_Active,0);
Îáðàáîòêà ñîáûòèé äåëàåòñÿ ðîâíî òàê æå. Åñòü íåñêîëüêî ñïîñîáîâ
ïîëó÷èòü èíôîðìàöèþ î ñîáûòèè. Ïðèâåä¸ì òðè èç íèõ - ReturnIDs,
Callback hook è Write Long.
ReturnID ïðåäñòàâëÿåò ñîáîé ÷èñëî, âîçâðàùàåìîå DoMethod() â
ãëàâíîì öèêëå MUI-ïðîãðàììû. Ìîæíî çàïðîãðàììèðîâàòü íåñêîëüêî òàêèõ
÷èñåë íà ðàçíûå ñîáûòèÿ, è â çàâèñèìîñòè îò ÷èñëà âûïîëíÿòü ðàçíûå
äåéñòâèÿ. MUI óæå ïðåäîñòàâëÿåò MUIV_Application_ReturnID_Quit,
êîòîðûé âîçâðàùàåòñÿ, â ÷àñòíîñòè, ïðè âûïîëíåíèè Remove èç ïðîãðàììû
Exchange (ëþáîå MUI ïðèëîæåíèå, åñëè íå óêàçàíî èíîãî, ïî óìîë÷àíèþ
ÿâëÿåòñÿ Commodity). Åñëè ìû õîòèì ïîëó÷àòü òîò æå ReturnID ïðè
íàæàòèè íà êíîïêó çàêðûòèÿ îêíà mainwin, ïèøåì ñëåäóþùåå:
DoMethod(mainwin,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,app,2,
MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
ãäå app - îáúåêò Application.
Callback hook ïðåäñòàâëÿåò ñîáîé ìåõàíèçì âûçîâà ïîëüçîâàòåëüñêèõ
ôóíêöèé â ñëó÷àå âîçíèêíîâåíèÿ ñîáûòèé. Äëÿ ýòîãî âûïîëíÿåòñÿ
MUIM_CallHook ñ àðãóìåíòîì - óêàçàòåëåì íà ñòðóêòóðó Hook.
MUIM_WriteLong ïîçâîëÿåò çàïèñàòü ÷èñëî ïî óêàçàííîìó àäðåñó â
ïàìÿòè. Ýòî ïîçâîëÿåò îòêàçàòüñÿ îò îáñëóæèâàíèÿ ñîáûòèé îò
ýëåìåíòîâ, çàäàþùèõ ðåæèìû ðàáîòû, è òîëüêî â íóæíûé ìîìåíò
ïðîàíàëèçèðîâàòü ñîñòîÿíèå óêàçàííûõ ÿ÷ååê ïàìÿòè.
MUIM_WriteString - òî æå ñàìîå äëÿ ñòðîê, à íå ëîíãîâ.
10) Äèíàìè÷åñêàÿ êîìïîíîâêà îáúåêòîâ
 ëþáîé ìîìåíò â ïðîöåññå ðàáîòû ïðèëîæåíèÿ åñòü âîçìîæíîñòü
äèíàìè÷åñêè äîáàâèòü èëè îòîáðàòü ó êàêîãî-ëèáî îáúåêòà åãî äî÷åðíèå
îáúåêòû. Äëÿ ýòîãî ñóùåñòâóþò ìåòîäû OM_ADDMEMBER è OM_REMMEMBER.
Íàïðèìåð, äëÿ äîáàâëåíèÿ îáúåêòà - êíîïêè Delete ê ôàéëîâîìó
ðåêâåñòîðó íóæíî âûïîëíèòü
DoMethod(group,OM_ADDMEMBER,SimpleButton("Óäàëèòü"));
íàä ãðóïïîé, êîòîðàÿ áóäåò ñîäåðæàòü ýòó êíîïêó.
 ïðîöåññå âûïîëíåíèÿ ìåòîäà, åñëè îêíî áûëî îòêðûòî, èíòåðôåéñ
ïåðåðèñóåòñÿ â ðåàëüíîì âðåìåíè è ê èìåþùèìñÿ êíîïêàì äîáàâèòñÿ íîâàÿ.
11) Îáùèé îáçîð ðåàëèçàöèè èíòåðôåéñà
Ðàññìîòðèì ïîðÿäîê äåéñòâèé, íåîáõîäèìûõ äëÿ ïîñòðîåíèÿ ìèíèìàëüíîé
ïðîãðàììû ïîä MUI.
à) îòêðûâàåì muimaster.library è intuition.library
Intuition ïîòðåáóåòñÿ íàì äëÿ get() è set().
á) ñîçäà¸ì îáúåêò Application.
â) âûïîëíÿåì ðÿä âûçîâîâ DoMethod()
Çäåñü íóæíî âûïîëíèòü êàê ìèíèìóì ñëåäóþùèå äåéñòâèÿ:
- óñòàíîâèòü ñâÿçè
- îòêðûòü îêíî (îêíà).
ã) âûïîëíÿåì ìåòîä MUIM_Application_NewInput íàä îáúåêòîì
Application, ïåðåäàâ åìó óêàçàòåëü íà ïåðåìåííóþ sigs.
ä) ïðîâåðÿåì ðåçóëüòàò, êîòîðûé âîçâðàòèë DoMethod() - ýòî íóæíûé
íàì ReturnID. Åñëè ýòî Quit - ïåðåõîäèì íà è)
å) àíàëèçèðóåì ïåðåìåííóþ sigs. Åñëè îíà ðàâíà íóëþ - ïåðåõîäèì
îáðàòíî íà ïóíêò ã)
æ) åñëè ïåðåìåííàÿ sigs íå ðàâíà íóëþ - sigs = Wait(sigs);
ç) âîçâðàùàåìñÿ íà ã)
è) óíè÷òîæàåì îáúåêò Application. Îêíà çàêðûâàþòñÿ àâòîìàòè÷åñêè.
ê) çàêðûâàåì áèáëèîòåêè.
12) Äîñòóïíûå êëàññû è èõ íàçíà÷åíèå
aboutmui.mui
Ïðåäñòàâëÿåò ñîáîé îêîøêî, êîòîðîå îáû÷íî âûâîäèòñÿ ïðèëîæåíèÿìè ïî
ïóíêòó ìåíþ «About MUI».
application.mui
Ïðèëîæåíèå - êîðíåâîé îáúåêò äåðåâà, ðàññìîòðåííîãî ðàíåå.
area.mui
Ïðÿìîóãîëüíàÿ îáëàñòü. Ýòî ñóïåðêëàññ ïðàêòè÷åñêè âñåõ êëàññîâ MUI.
Èìååò íàáîð àòðèáóòîâ òèïà ðàçìåðîâ, êîîðäèíàò è ò.ï., íàñëåäóåìûõ
áîëüøèíñòâîì îñòàëüíûõ êëàññîâ.
balance.mui
Óïðàâëÿþùèé ýëåìåíò äëÿ balancing groups. Ðàçìåùàåòñÿ â ëþáîì
ìåñòå èíòåðôåéñà è ïîçâîëÿåò, «õâàòàÿñü» çà íåãî ìûøêîé, ïåðåäâèãàòü
åãî, ìåíÿÿ ïðîïîðöèè ðàñïîëîæåííûõ ïî ñòîðîíàì îò íåãî îáúåêòîâ.
bitmap.mui
Ïîçâîëÿåò èñïîëüçîâàòü êàðòèíêó, îïèñàííóþ ñòðóêòóðîé Bitmap.
bodychunk.mui
Ïîçâîëÿåò èñïîëüçîâàòü êàðòèíêó â IFF ILBM ôîðìàòå.
boopsi.mui
Èíòåðôåéñ äëÿ èñïîëüçîâàíèÿ ëþáûõ BOOPSI êëàññîâ â MUI èíòåðôåéñå,
â ÷àñòíîñòè, ColorWheel, èñïîëüçóåìîãî ïðè íàñòðîéêå öâåòà.
coloradjust.mui
Ýëåìåíò íàñòðîéêè öâåòà (íà kickstart 3.0 èñïîëüçóåò ColorWheel).
Ïîçâîëÿåò âûáðàòü RGB è ÿðêîñòü.
colorfield.mui
Èíäèêàòîð öâåòà. Ïî ìåðå âîçìîæíîñòè îòîáðàæàåò â ïðÿìîóãîëüíèêå
öâåò, çàäàííûé êîìïîíåíòàìè RGB. Íà ks 2.x áóäåò ÷¸ðíûì.
cycle.mui
Cycle gadget (êíîïêà ñ âûáîðîì âàðèàíòà)
dataspace.mui
Êîíòåéíåð ïðîèçâîëüíîé èíôîðìàöèè.  ÷àñòíîñòè, èñïîëüçóåòñÿ MUI
äëÿ õðàíåíèÿ íàñòðîåê.
dirlist.mui
Ñïèñîê ôàéëîâ. Ñàìîñòîÿòåëüíî ñ÷èòûâàåò äèðåêòîðèþ, ïîêàçûâàåò å¸
ñîäåðæèìîå, ïîçâîëÿåò âûáèðàòü ñòðîêó.
family.mui
Ñóïåðêëàññ äëÿ êëàññîâ, îïåðèðóþùèõ ñïèñêîì ñóáêëàññîâ.
Èñïîëüçóåòñÿ äëÿ ìåíþ.
floattext.mui
Ñóáêëàññ êëàññà list ñ âîçìîæíîñòüþ ôîðìàòèðîâàíèÿ àáçàöåâ ïî
ïðàâîìó êðàþ.
gauge.mui
Èñïîëüçóåòñÿ äëÿ progress-bar'îâ. Ìîãóò áûòü êàê ãîðèçîíòàëüíûìè,
òàê è âåðòèêàëüíûìè, è ñîäåðæàòü ñòðîêó.
group.mui
Ãðóïïà (îïèñàíà ðàíåå)
image.mui
Ïðîèçâîëüíàÿ êàðòèíêà, â òîì ÷èñëå èç ôàéëà ïî çàäàííîìó ïóòè.
Ê ñîæàëåíèþ, òðåáóåò óêàçûâàòü æ¸ñòêî çàäàííîå ðàçðåøåíèå.
knob.mui
Ýëåìåíò òèïà ðåãóëÿòîðà ãðîìêîñòè, âðàùàåìîãî ìûøêîé
levelmeter.mui
Ñòðåëî÷íûé èíäèêàòîð
list.mui
Ñïèñîê. Îáû÷íî èñïîëüçóåòñÿ êàê äî÷åðíèé îáúåêò ó listview.
listview.mui
Äîáàâëÿåò ê ñïèñêó óïðàâëÿþùèé ñêðîëëáàð è îáðàáîòêó ââîäà.
menu.mui
Îáúåêò ïðåäñòàâëÿåò ñîáîé îäíî âûïàäàþùåå ìåíþ (ê ïðèìåðó, ìåíþ
Project).
menuitem.mui
Ïóíêò âûïàäàþùåãî ìåíþ.
menustrip.mui
Ìåíþ â öåëîì (ìîæíî óñòàíàâëèâàòü enable/disable ãëîáàëüíî).
notify.mui
Ñóïåðêëàññ âñåõ êëàññîâ MUI. Îáåñïå÷èâàåò ñâÿçûâàíèå îáúåêòîâ,
îáðàáîòêó ñîáûòèé, à òàêæå ðÿä äðóãèõ ïîëåçíûõ ìîìåíòîâ.
numeric.mui
Ñóïåðêëàññ äëÿ ëþáûõ ýëåìåíòîâ, îáåñïå÷èâàþùèõ ðàáîòó ñ öåëûìè
÷èñëàìè - íàïðèìåð, äëÿ knob.mui. Ñàì ïî ñåáå íå ïðåäîñòàâëÿåò
íèêàêèõ ñðåäñòâ GUI.
numericbutton.mui
Êíîïêà âûáîðà ÷èñëà. Ïðåäñòàâëÿåò ñîáîé slider, «ñâ¸ðíóòûé» â
êíîïêó äëÿ ýêîíîìèè ìåñòà.
palette.mui
Ïîëíûé íàáîð ýëåìåíòîâ äëÿ íàñòðîéêè ïàëèòðû.
popasl.mui
Ñóáêëàññ êëàññà popstring, ñàìîñòîÿòåëüíî âûçûâàþùèé asl.library
äëÿ ðåêâåñòîðîâ ðàçíîãî ðîäà. Ñîçäà¸ò äî÷åðíèé ïðîöåññ, áëàãîäàðÿ
÷åìó âûïîëíåíèå çàäà÷è ïðè âûçîâå ðåêâåñòîðà íå áëîêèðóåòñÿ.
poplist.mui
Âûïàäàþùèé ñïèñîê ïðîèçâîëüíûõ îáúåêòîâ.
popobject.mui
Ïîçâîëÿåò ñîçäàâàòü ëþáûå, âûïàäàþùèå ïî íàæàòèþ êíîïêè îáúåêòû.
popstring.mui
Ñóïåðêëàññ äëÿ âûïàäàþùèõ îáúåêòîâ. Ïîçâîëÿåò ñîçäàâàòü ñïèñîê
ñòðîê è âûáèðàòü ñòðîêó.
prop.mui
Àíàëîã propgadgets â intuition - äâèæîê, óïðàâëÿåìûé ìûøüþ. Ìîæåò
áûòü êàê ãîðèçîíòàëüíûì, òàê è âåðòèêàëüíûì. Òàêæå ìîæåò èñïîëüçîâàòü
áîðäþðû îêîí (êàê â Workbench).
radio.mui
Radiobutton äëÿ âûáîðà íåñêîëüêèõ âàðèàíòîâ.
rectangle.mui
«Ïóñòîå ìåñòî» äëÿ äèçàéíà èíòåðôåéñà. Ìîæåò ñîäåðæàòü
ãîðèçîíòàëüíóþ èëè âåðòèêàëüíóþ ïîëîñó-ðàçäåëèòåëü è íàäïèñü.
register.mui
Óìåùàåò íåñêîëüêî îáúåêòîâ â îäíî è òî æå ïðîñòðàíñòâî ñ
âîçìîæíîñòüþ âûáîðà, êàêîé èç íèõ ïîêàçûâàòü, ñ ïîìîùüþ «çàêëàäîê».
scale.mui
Ïðîöåíòíàÿ øêàëà (îò 0 äî 100%). Îáû÷íî èñïîëüçóåòñÿ äëÿ Gauge.
scrollbar.mui
Íàáîð èç propgadget-à è äâóõ êíîïîê ñî ñòðåëêàìè.
scrollgroup.mui
Êëàññ äëÿ ïîääåðæêè ãîðèçîíòàëüíîé è âåðòèêàëüíîé ïðîêðóòêè
«âèðòóàëüíîé» ãðóïïû. Ïðèìåð - ñêðîëëèíã îêíà â IBrowse.
semaphore.mui
Ñåìàôîð äëÿ ðàçãðàíè÷åíèÿ äîñòóïà ê dataspace îò ðàçíûõ çàäà÷.
slider.mui
Ýëåìåíò äëÿ âûáîðà ÷èñëà ñ ïîìîùüþ «äâèæêà», óïðàâëÿåìîãî ìûøüþ.
string.mui
Ïîëå ââîäà ñòðîêè.
text.mui
Íàäïèñü ñ ðàçëè÷íûìè âîçìîæíîñòÿìè îôîðìëåíèÿ.
virtgroup.mui
«Âèðòóàëüíàÿ» ãðóïïà, êîòîðàÿ ìîæåò áûòü áîëüøåãî ðàçìåðà, ÷åì
âûäåëåí äëÿ íå¸ â èíòåðôåéñå.
volumelist.mui
Ñïèñîê óñòðîéñòâ.
window.mui
Êëàññ îêíà.
13) ßçûê îïèñàíèÿ èíòåðôåéñà áîëåå ïîäðîáíî
Äëÿ òîãî, ÷òîáû íå ïèñàòü êàæäûé ðàç âðó÷íóþ âûçîâ ôóíêöèè
MUI_NewObject() è èìÿ êëàññà, â mui.h îïðåäåë¸í íàáîð ìàêðîñîâ äëÿ
äîñòóïà êî âñåì èìåþùèìñÿ êëàññàì. Òàêèì îáðàçîì, ñòðîêà òèïà
êëàññObject
ïðåîáðàçóåòñÿ â ñòðîêó
MUI_NewObject(êëàññ
Äàëåå ÷åðåç çàïÿòûå ïèøåòñÿ taglist. Äëÿ åãî çàâåðøåíèÿ, êàê
óïîìèíàëîñü, èñïîëüçóåòñÿ ìàêðîñ End, ðàçâîðà÷èâàþùèéñÿ â TAG_END).
Ðàçóìååòñÿ, ïðèâåä¸ííûì âûøå ñïèñêîì ðàçíîîáðàçèå ýëåìåíòîâ
èíòåðôåéñà íå îãðàíè÷èâàåòñÿ. Íàïðèìåð, MUI íå èìååò ñïåöèàëüíîãî
êëàññà «êíîïêà» - äëÿ ýòîãî îáû÷íî èñïîëüçóåòñÿ îáúåêò ëþáîãî
ñóáêëàññà (íàïðèìåð, text.mui) êëàññà Area, ó êîòîðîãî óñòàíàâëèâàåòñÿ
àòðèáóò MUIA_InputMode. Òàêèì îáðàçîì êíîïêè ìîãóò ñîäåðæàòü íå
òîëüêî íàäïèñè, íî è ëþáîé ïðàêòè÷åñêè ïðîèçâîëüíûé íàáîð îáúåêòîâ.
×àñòî èñïîëüçóåìûå ýëåìåíòû èíòåðôåéñà èìåþò óæå îïðåäåë¸ííûå
ìàêðîñû ñ íàáîðîì ïàðàìåòðîâ, ñðàçó çàäàþùèå íåîáõîäèìûå àòðèáóòû.
Ê ïðèìåðó, êíîïêà îïèñûâàåòñÿ êàê SimpleButton("íàäïèñü").
Âñå îïðåäåë¸ííûå ýëåìåíòû ñ îïèñàíèåì ìîæíî íàéòè â ôàéëå mui.h.
Òàì æå îïðåäåëåíî ìíîæåñòâî äðóãèõ ìàêðîñîâ, â ÷àñòíîñòè, çàðàíåå
îïðåäåë¸ííûå àòðèáóòû. Íàïðèìåð, äëÿ óêàçàíèÿ òèïà ðàìêè äëÿ êíîïêè
âìåñòî MUIA_Frame, MUIV_Frame_Button äîñòàòî÷íî íàïèñàòü ButtonFrame.
14) Ïðèìåð ïðîñòåéøåé ïðîãðàììû
Ñàìûé ïðîñòîé ñïîñîá ñäåëàòü ïåðâóþ ïðîãðàììó ïîä MUI - ñêîìïèëèòü
ïðèâåä¸ííûé íèæå èñõîäíèê, «âüåõàòü», êàê îí ðàáîòàåò, ïîìåíÿòü è
ñäåëàòü ÷òî-òî ñâî¸. Èñõîäíèê ïî âîçìîæíîñòè ïðîêîììåíòèðîâàí. Êàê
òîëüêî ýòîãî âàðèàíòà ñòàíåò ìàëî - èçó÷àéòå èñõîäíèêè MUI Demos,
ïðèëàãàåìûõ ê àðõèâó ñ äîêóìåíòàöèåé ïî MUI.
Ïðîãðàììà ïðîâåðåíà ïîä SAS/C 6.58 è Hisoft C 4.0. Â óñòàíîâêàõ
íåîáõîäèìî âûêëþ÷èòü ëèíêîâêó ñî ñòàðòàï-êîäîì. Äëÿ Hisoft C íóæíî
äîáàâèòü ê ïðîåêòó muistubs.lib. Ïðîãðàììà çàïóñêàåòñÿ èç CLI.
#include <clib/exec_protos.h>
#include <clib/muimaster_protos.h>
#include <clib/dos_protos.h>
#include <clib/alib_protos.h>
#ifdef __SASC
#define VERDATE __AMIGADATE__
#include <pragmas/exec_sysbase_pragmas.h>
#include <pragmas/muimaster_pragmas.h>
#include <pragmas/dos_pragmas.h>
#define GetBaseReg()
#else
#define VERDATE "("__DATE2__")"
#include <pragma/exec_lib.h>
#include <pragma/muimaster_lib.h>
#include <pragma/dos_lib.h>
#include <linkerfunc.h>
#define __saveds
#endif
#include <libraries/mui.h>
#include <dos/dos.h>
#ifndef MAKE_ID
#define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16\
| (ULONG) (c)<<8 | (ULONG) (d))
#endif
enum {
ReturnID_ButtonPressed = 1,
ReturnID_ButtonReleased,
ReturnID_StringEntered
};
struct Library *MUIMasterBase, *IntuitionBase, *DOSBase, *SysBase;
__saveds main()
{
GetBaseReg(); // ýòî äëÿ Hisoft C
SysBase = *((struct Library **)4L); // SysBase â ïåðåìåííóþ
if(DOSBase = OpenLibrary("dos.library",36))
{
if(IntuitionBase = OpenLibrary("intuition.library",39))
{
if(MUIMasterBase = OpenLibrary("muimaster.library",0))
{
Object *app, *win, *button, *string;
if(app = ApplicationObject,
MUIA_Application_Title, "Ïðîãðàììà",
MUIA_Application_Version, "$VER: Ïðîãðàììà 1.0 "VERDATE,
MUIA_Application_Copyright, "(C) 1999 Ïðîãðàììèíã Êîìïýíè",
MUIA_Application_Author, "Ïðîãðàììèñò",
MUIA_Application_Description, "Ïðîñòî êàêàÿ-òî ïðîãðàììà",
MUIA_Application_Base,"PROGRAM",
SubWindow, win = WindowObject,
MUIA_Window_Title, "Ïðîãðàììà",
MUIA_Window_ID, MAKE_ID('M','A','I','N'),
WindowContents, VGroup,
Child, button = SimpleButton("Íàæìè ìåíÿ"),
Child, string = String("Ââåäèòå òåêñò",40),
End,
End,
End)
{
unsigned long id, sigs = 0;
// Îòêðûâàåì îêíî
set(win,MUIA_Window_Open,TRUE);
// óñòàíàâëèâàåì ñâÿçü ìåæäó íàæàòèåì íà êíîïêó çàêðûâàíèÿ
// îêíà è âûõîäîì èç ïðîãðàììû
DoMethod(win,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,app,2,
MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
// ñâÿçü ìåæäó íàæàòèåì êíîïêè è âîçâðàòîì ðåçóëüòàòà
DoMethod(button,MUIM_Notify,MUIA_Pressed,TRUE,
app,2,MUIM_Application_ReturnID,ReturnID_ButtonPressed);
// ñâÿçü ìåæäó îòïóñêàíèåì êíîïêè è âîçâðàòîì ðåçóëüòàòà
DoMethod(button,MUIM_Notify,MUIA_Pressed,FALSE,
app,2,MUIM_Application_ReturnID,ReturnID_ButtonReleased);
// ñâÿçü ìåæäó ââîäîì ñòðîêè è âîçâðàòîì ðåçóëüòàòà
DoMethod(string,MUIM_Notify,MUIA_String_Acknowledge,
MUIV_EveryTime, // ïðè âñÿêîì èçìåíåíèè ñîñòîÿíèÿ àòðèáóòà
app,2,MUIM_Application_ReturnID,ReturnID_StringEntered);
// îæèäàåì ñîáûòèÿ
while((id = DoMethod(app,MUIM_Application_NewInput,&sigs))
!= MUIV_Application_ReturnID_Quit)
{
switch(id) // ïðîâåðÿåì âîçâðàù¸ííûé íàì ReturnID
{
case ReturnID_ButtonPressed:
Printf("Âû íàæàëè êíîïêó\n"); break;
case ReturnID_ButtonReleased:
Printf("Âû îòïóñòèëè êíîïêó\n"); break;
case ReturnID_StringEntered:
{
STRPTR res;
// ñ÷èòûâàåì óêàçàòåëü íà ñòðîêó â ïåðåìåííóþ
get(string,MUIA_String_Contents,&res);
Printf("Âû ââåëè ÷òî-òî òèïà <<%s>>\n",res);
break;
}
}
if (sigs)
{
// îæèäàåì ñèãíàëà
sigs = Wait(sigs | SIGBREAKF_CTRL_C);
// åñëè íàæàëè CTRL+C - âûõîäèì
if (sigs & SIGBREAKF_CTRL_C) break;
}
}
MUI_DisposeObject(app);
}
CloseLibrary(MUIMasterBase);
}
CloseLibrary(IntuitionBase);
}
CloseLibrary(DOSBase);
}
}
15) Íåêîòîðûå âàæíûå ìîìåíòû
Âàæíîå çàìå÷àíèå îòíîñèòåëüíî âûøå ïðèâåä¸ííîãî ïðèìåðà. Ïðèíÿòî
äåëàòü ðåàêöèþ íà ÎÒÏÓÑÊÀÍÈÅ, à íå íà ÍÀÆÀÒÈÅ êíîïêè - äëÿ òîãî, ÷òîáû
ïîëüçîâàòåëü â ïîñëåäíèé ìîìåíò ñìîã îòêàçàòüñÿ îò íàæàòèÿ, è ÷òîáû
íàæàòèå íå ïðîèçîøëî ñëó÷àéíî. Îáðàáîòêà íàæàòèÿ ïðèâåäåíà ëèøü äëÿ
òîãî, ÷òîáû ïðîèëëþñòðèðîâàòü òàêóþ âîçìîæíîñòü.
MUI ðàáîòàåò â êîíòåêñòå âûçûâàþùåé çàäà÷è. Ýòî îçíà÷àåò, ÷òî
ïðîãðàììà îáÿçàíà çà ìèíèìàëüíîå âðåìÿ îòðåàãèðîâàòü íà ëþáîå
ñëó÷èâøèåñÿ ñîáûòèå. Åñëè ïðîãðàììà îòâëåêàåòñÿ íà îòðàáîòêó
êàêîãî-ëèáî äåéñòâèÿ (íàïðèìåð, ÷èòàåò â ïàìÿòü î÷åíü áîëüøîé ôàéë),
òî èíòåðôåéñ «óìèðàåò», íà âðåìÿ ïðåâðàùàÿñü â ñòàòè÷åñêóþ êàðòèíêó
(÷òî ìîæíî íàáëþäàòü, íàïðèìåð, â YAM ïðè îæèäàíèè îòâåòà ñåðâåðà).
Åñòü äâà ñïîñîáà, êàê ýòî îáîéòè. Ïåðâûé ñïîñîá ñâîäèòñÿ ê òîìó,
÷òî âî âðåìÿ äëèòåëüíîãî äåéñòâèÿ (ê ïðèìåðó, àðõèâàöèè) âðåìÿ îò
âðåìåíè ïðîâåðÿòü, íå ïîñòóïèëè ëè êàêèå-ëèáî ñèãíàëû). Âòîðîé ñïîñîá
- ñîçäàòü äî÷åðíèé ïðîöåññ è ïîðó÷èòü ðàáîòó åìó, îáìåíèâàÿñü ñ íèì
ñîîáùåíèÿìè.
Ïîñëå ñîçäàíèÿ èíòåðôåéñà ÎÁßÇÀÒÅËÜÍÎ íåîáõîäèìî ïðîâåðèòü, áóäóò
ëè îêíà ïðîãðàììû óìåùàòüñÿ íà ýêðàí 640x200 ïðè ôîíòàõ 8x8 - ýòî
îáùåå ïðàâèëî äëÿ âñåõ ïðîãðàìì, è MUI òóò íå èñêëþ÷åíèå. Åñëè îêíî
íå âëåçàåò â ýêðàí, MUI ïîïûòàåòñÿ çàìåíèòü øðèôòû íà Helvetica/9, à
åñëè è ýòî íå ïîìîæåò, òî îêíî ïîïðîñòó íå îòêðîåòñÿ. Ðàáîòà ñ íå
îòêðûòûì îêíîì íå ÿâëÿåòñÿ îøèáêîé, âñå îïåðàöèè ïðè ýòîì âàëèäíû -
íî, î÷åâèäíî, íèêàêîãî âçàèìîäåéñòâèÿ ñ ïîëüçîâàòåëåì ïðè ýòîì íå
áóäåò. ×òîáû èçáåæàòü ýòîé ñèòóàöèè, ïðîâåðÿéòå MUIA_Window_Open.
16) Custom classes è çà÷åì îíè íóæíû
Custom-êëàññû ïðèìåíÿþòñÿ â òåõ ñëó÷àÿõ, êîãäà ñòàíäàðòíîãî íàáîðà
êëàññîâ MUI íà÷èíàåò íå õâàòàòü. Íàïðèìåð, åñëè íóæåí ýëåìåíò
èíòåðôåéñà ñ õèòðûì âåêòîðíûì èçîáðàæåíèåì.
Custom-êëàññû áûâàþò äâóõ âèäîâ - public è private.
Public custom class ïðåäñòàâëÿåò ñîáîé áèáëèîòåêó, êîòîðàÿ îáû÷íî
êëàä¸òñÿ â mui:libs. Îíè èìåþò èìåíà, îêàí÷èâàþùèåñÿ íå íà «.mui», à
íà «.mcc» (MuiCustomClass). Ðàáîòà ñ íèìè ïî ñóòè íå îòëè÷àåòñÿ îò
ðàáîòû ñî ñòàíäàðòíûì íàáîðîì êëàññîâ. Ìíîãèå êëàññû èìåþò ñâîè
ñîáñòâåííûå íàñòðîéêè, êîòîðûå äîáàâëÿþòñÿ â ñïèñîê íàñòðîåê MUI Prefs
- ýòè íàñòðîéêè òîæå ïðåäñòàâëÿþò ñîáîé áèáëèîòåêó, êîòîðàÿ êëàä¸òñÿ â
mui:libs è îêàí÷èâàþòñÿ íà «.mcp» (íå ïóòàéòå ñ ïðîãðàììîé MCP).
Private custom class ñóùåñòâóåò òîëüêî â ïðåäåëàõ Âàøåé ïðîãðàììû.
Ôàêòè÷åñêè ýòî âñåãî ëèøü îäíà ôóíêöèÿ - òàê íàçûâàåìûé äèñïåò÷åð
êëàññà. Ýòà ôóíêöèÿ ïîëó÷àåò óïðàâëåíèå âñÿêèé ðàç, êîãäà âûïîëíÿåòñÿ
êàêîé-ëèáî ìåòîä, è ïîëó÷àåò â êà÷åñòâå àðãóìåíòà êðîìå âñåãî ïðî÷åãî
óêàçàòåëè íà îáúåêò è íà âûïîëíÿåìûé ìåòîä. ×àñòü ìåòîäîâ è àòðèáóòîâ
êëàññ îáðàáàòûâàåò ñàì, âñ¸ îñòàëüíîå, ïðî ÷òî îí íå çíàåò, îí ïðîñòî
ïåðåäà¸ò «âûøåñòîÿùåìó» êëàññó ôóíêöèåé DoSuperMethod().
Ïîñêîëüêó ó private-êëàññà íåò èìåíè, îáúåêòû ýòîãî êëàññà
ñîçäàþòñÿ âûçîâîì íå MUI_NewObject(), à NewObject() èç Intuition.
 êà÷åñòâå ïðèìåðà ñìîòðèòå èñõîäíèêè MUI Demos (Class#?.c).
17) Íå ðàññìîòðåííûå ðàíåå ôóíêöèè muimaster.library
MUI_SetError()
MUI_Error()
Óñòàðåâøèå ôóíêöèè, âìåñòî íèõ ðåêîìåíäóåòñÿ ïðèìåíÿòü SetIOErr() è
IOErr() dos.library.
MUI_AllocAslRequest()
MUI_AslRequest()
MUI_FreeAslRequest()
Èíòåðôåéñ ê asl.library. Â MUI-ïðîãðàììàõ íåîáõîäèìî èñïîëüçîâàòü
èìåííî ýòè ôóíêöèè âìåñòî ôóíêöèé asl.library, reqtools.library etc -
ïîñêîëüêó â äàííîì ñëó÷àå MUI èìååò âîçìîæíîñòü îáðàáàòûâàòü,
íàïðèìåð, ñâîðà÷èâàíèå ïðîãðàììû â èêîíêó, çàêðûâàÿ âñå îêíà.
MUI_CreateCustomClass()
MUI_DeleteCustomClass()
Ðåãèñòðàöèÿ è óäàëåíèå custom-êëàññîâ - êàê private, òàê è public
(â ïîñëåäíåì ñëó÷àå âûçûâàþòñÿ èç ñëóæåáíûõ ôóíêöèé áèáëèîòåêè).
Ïðè ñîçäàíèè êëàññà ïåðåäà¸òñÿ óêàçàòåëü íà ôóíêöèþ-äèñïåò÷åð, áàçó
áèáëèîòåêè äëÿ public êëàññîâ, ñóïåðêëàññ, è ðàçìåð data-ñòðóêòóðû.
MUI_FreeClass()
MUI_GetClass()
Óñòàðåâøèå ôóíêöèè, âìåñòî íèõ ïðèìåíÿéòå âûøåóïîìÿíóòûå.
MUI_MakeObjectA()
Àíàëîã MUI_NewObject(). Îòëè÷àåòñÿ áîëåå êîìïàêòíûì âûçîâîì -
ôóíêöèè ïåðåäà¸òñÿ ÊÎÄ ñîçäàâàåìîãî îáúåêòà (íå ñòðîêà!) è íàáîð
ïàðàìåòðîâ (íå taglist!), ñïåöèôè÷íûé äëÿ îáúåêòà. Ñîçäà¸ò ðÿä
çàðàíåå îïðåäåë¸ííûõ îáúåêòîâ, â îñíîâíîì èñïîëüçóåòñÿ â ìàêðîñàõ,
îïðåäåë¸ííûõ â mui.h.
Ëþáîé âûçîâ äàííîé ôóíêöèè ìîæíî çàìåíòü àíàëîãè÷íûì âûçîâîì
MUI_NewObject(), íî íå íàîáîðîò.
MUI_ObtainPen()
MUI_ReleasePen()
Àíàëîãè ôóíêöèé graphics.library (äîñòóïíûõ òîëüêî íà v39+), íî
ðàáîòàþò è íà v36.
MUI_Redraw()
Ôóíêöèÿ âûçûâàåòñÿ ÒÎËÜÊÎ èç custom classes. Íàçíà÷åíèå ñëåäóþùåå:
åñëè â êàêîé-òî ìîìåíò âðåìåíè îáúåêò íóæíî ïåðåðèñîâàòü (íàïðèìåð,
èçìåíèëèñü àòðèáóòû), âìåñòî ðèñîâàíèÿ åãî êëàññ äîëæåí âûçâàòü ýòó
ôóíêöèþ. MUI ïðîèçâåä¸ò ðàñ÷¸ò âñåõ íåîáõîäèìûõ êîîðäèíàò è îáëàñòåé
îòñå÷åíèÿ (äëÿ virtual-ãðóïï), ïîñëå ÷åãî âûïîëíèò ìåòîä MUIM_Draw.
Ðèñîâàíèå â îêíî ìîæíî âûïîëíÿòü ÒÎËÜÊÎ ïðè ïîëó÷åíèè MUIM_Draw!
MUI_Request()
MUI-ðåêâåñòåð, àíàëîã EasyRequest(). Âûçîâ MUI_Request() áëîêèðóåò
îáðàáîòêó èíòåðôåéñà.
MUI_RejectIDCMP()
MUI_RequestIDCMP()
Ôóíêöèè äëÿ custom-êëàññîâ. Èñïîëüçóþòñÿ êëàññàìè, îáðàáàòûâàþùèìè
ââîä - ñîáûòèÿ îò êëàâèàòóðû è ìûøè. Ïîñêîëüêó äàëåêî íå âñåì
îáúåêòàì òðåáóåòñÿ îáðàáîòêà ââîäà, äëÿ óìåíüøåíèÿ íàêëàäíûõ ðàñõîäîâ
íà «øèðîêîâåùàòåëüíóþ» ðàññûëêó ñîáûòèé ýòè ñîáûòèÿ ðàññûëàþòñÿ òîëüêî
çàïðîñèâøèì èõ êëàññàì.
Çàïðàøèâàòü âåñüìà êðèòè÷íûå ïî âðåìåíè ñîáûòèÿ (IDCMP_INTUITICKS,
IDCMP_MOUSEMOVE) èìååò ñìûñë òîëüêî íà òî âðåìÿ, ïîêà îíè òðåáóþòñÿ.
18) Áîëåå ïîäðîáíî î custom-êëàññàõ
MUI ðàáîòàåò ñ îáúåêòàìè ðàçëè÷íûõ êëàññîâ ïóò¸ì âûïîëíåíèÿ
ñïåöèôè÷íîãî íàáîðà ìåòîäîâ. ×àñòü èç ìåòîäîâ îáÿçàòåëüíî äîëæíà áûòü
ðåàëèçîâàíà â ëþáîì custom-êëàññå, îñòàëüíûå æå íåîáÿçàòåëüíû.
Êàê ëþáîé BOOPSI îáúåêò, MUI-îáúåêò ñîçäà¸òñÿ âûïîëíåíèåì ìåòîäà
OM_NEW. Ïîñêîëüêó îáúåêòû â MUI ñîçäàþòñÿ îò áîëåå ìåëêèõ ê áîëåå
êðóïíûì, ê ìîìåíòó ñîçäàíèÿ îáúåêò åù¸ íè÷åãî íå «çíàåò» î ñâîéñòâàõ
äèñïëåÿ.
Êîãäà âñå îáúåêòû ñîçäàíû, MUI âûïîëíÿåò ìåòîä MUIM_Setup, ðàññûëàÿ
îáúåêòàì èíôîðìàöèþ î ýêðàíå, øðèôòàõ è ò.ï. Îêîí íà ýòîò ìîìåíò åù¸
íå ñóùåñòâóåò.
Ñëåäóþùèé ìåòîä, ðàññûëàåìûé MUI - MUIM_AskMinMax. Ýòî çàïðîñ
îáúåêòà î åãî ðàçìåðàõ - ìàêñèìàëüíîì, ìèíèìàëüíîì è ïî óìîë÷àíèþ.
Âûïîëíåíèå ýòîãî ìåòîäà îáÿçàòåëüíî, åñëè Âû íå õîòèòå ïîëó÷èòü
ïðÿìîóãîëüíèê íóëåâîãî ðàçìåðà ;)
Ïîñëå ðàñ÷¸òà âñåõ ïîëîæåíèé è êîîðäèíàò MUI ãîòîâ ê îòêðûòèþ îêíà.
Êàê òîëüêî îêíî îòêðûòî, MUI ðàññûëàåò ìåòîä MUIM_Show, ãîâîðÿùèé î
ñóùåñòâîâàíèè îêíà. MUIM_Show - ýòî åù¸ íå êîìàíäà íàðèñîâàòü ÷òî-òî
â îêíå. Îáû÷íî îí èñïîëüçóåòñÿ äëÿ äîáàâëåíèÿ Intuition gadgets ê
îêíó.
È íàêîíåö, ìåòîä MUIM_Draw ãîâîðèò î òîì, ÷òî íóæíî ïðèñòóïèòü ê
ðèñîâàíèþ. Âñÿêîå ïîëó÷åíèå MUIM_Draw äîëæíî çàïóñòèòü ïåðåðèñîâêó
îáúåêòà - îíà òðåáóåòñÿ íå òîëüêî ïðè îòêðûòèè îêíà, íî è ïðè ðåôðåøå,
à òàêæå ïðè íåîáõîäèìîñòè îòîáðàçèòü ñëåäóþùóþ ôàçó ó ðÿäà ýëåìåíòîâ
èíòåðôåéñà (ê ïðèìåðó, ñëåäóþùèé êàäð âèäåî â îêíå).
Êîãäà èçìåíÿåòñÿ ðàçìåð îêíà, MUI ïîñëåäîâàòåëüíî âûïîëíÿåò
MUIM_Hide, MUIM_Show è MUIM_Draw.
Ïðè çàâåðøåíèè ðàáîòû âñ¸ ïðîèçâîäèòñÿ â îáðàòíîì ïîðÿäêå. Ïåðåä
çàêðûòèåì îêíà âûïîëíÿþòñÿ MUIM_Hide. Åñëè íóæíî âûéòè èç ïðîãðàììû,
èëè ïðîñòî ïåðåíåñòè å¸ íà äðóãîé ýêðàí - âûïîëíÿåòñÿ MUIM_Cleanup.
Ïîñëåäíåå, ÷òî ïîëó÷èò îáúåêò - OM_DISPOSE.
Âñþ ïîñëåäîâàòåëüíîñòü äåéñòâèé ìîæíî ïðåäñòàâèòü ñëåäóþùèì
îáðàçîì. Çàêëþ÷¸ííûå â ôèãóðíûå ñêîáêè ôðàãìåíòû ÿâëÿþòñÿ öèêëàìè -
ìîãóò âûïîëíÿòüñÿ îäèí ðàç è áîëåå, à ìîãóò è íå âûïîëíèòüñÿ âîîáùå
OM_NEW; // çäåñü Âû åù¸ íè÷åãî íå çíàåòå î äèñïëåéíîì îêðóæåíèè
{
MUIM_Setup; // èíôîðìàöèÿ î äèñïëåå
MUIM_AskMinMax; // îïðîñ ðàçìåðîâ
// çäåñü îòêðûâàåòñÿ îêíî
{
MUIM_Show; // äîáàâèòü ê îêíó, åù¸ íå ðèñîâàòü
{
MUIM_Draw; // íàðèñîâàòü
}
MUIM_Hide; // óäàëèòü èç îêíà
}
// çäåñü îêíî çàêðûâàåòñÿ
MUIM_Cleanup; // îñâîáîæäàåì âñå äèñïëåéíî-çàâèñèìûå äàííûå
}
OM_DISPOSE; // óíè÷òîæàåì îáúåêò
[to be continued]